Spring MVC অ্যাপ্লিকেশন তৈরির সময় Caching, Lazy Loading, এবং Query Optimization অত্যন্ত গুরুত্বপূর্ণ বিষয়। এগুলি অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করতে এবং ডেটাবেসের উপর অপ্রয়োজনীয় লোড কমাতে সাহায্য করে। চলুন এই তিনটি গুরুত্বপূর্ণ কনসেপ্টের বিস্তারিত আলোচনা করা যাক।
Caching হল ডেটা সাময়িকভাবে সংরক্ষণ করা, যাতে পুনরায় একই ডেটা অ্যাক্সেস করতে হলে প্রতিবার ডেটাবেস বা অন্য কোন সিস্টেম থেকে নতুন করে ডেটা আনতে না হয়। এর ফলে অ্যাপ্লিকেশনটির পারফরম্যান্স অনেক উন্নত হয়, কারণ ডেটাবেসে অপ্রয়োজনীয় রিকোয়েস্ট কম হয় এবং দ্রুত রেসপন্স পাওয়া যায়।
Spring MVC তে Caching কনফিগার করা যেতে পারে। এখানে Spring Cache ব্যবহৃত হয়, যা বিভিন্ন ক্যাশ ইঞ্জিন যেমন EhCache, Redis, Caffeine ইত্যাদি সমর্থন করে।
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cache</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableCaching
public class CacheConfig {
// Custom cache configuration can be added here
}
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
public class ProductService {
@Cacheable("products") // Cache with key 'products'
public Product getProductById(Long id) {
// Simulating a slow database call
return productRepository.findById(id);
}
}
@Cacheable
: এই এনোটেশনটি যেকোনো মেথডের ওপর প্রয়োগ করা যেতে পারে। যখন সেই মেথড প্রথমবার কল হবে, তখন তার রিটার্ন ভ্যালু ক্যাশে রাখা হবে এবং পরবর্তীতে একই রিকোয়েস্টের জন্য ক্যাশ থেকে রিটার্ন হবে।@Cacheable("products")
ক্যাশে products
নামে একটি এন্ট্রি তৈরি করবে, যেখানে মেথডের রিটার্ন ভ্যালু সেভ হবে।Lazy Loading হল এমন একটি কৌশল, যেখানে শুধুমাত্র যখন প্রয়োজন হয় তখনই ডেটাবেস থেকে ডেটা লোড করা হয়। এটি সাধারণত Hibernate বা JPA এ ব্যবহৃত হয়, যাতে অপ্রয়োজনীয় সম্পর্কিত ডেটা ডেটাবেস থেকে লোড না হয়।
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;
@Entity
public class User {
@OneToMany(fetch = FetchType.LAZY)
private List<Order> orders; // Orders are lazily loaded
// Getter and Setter methods
}
orders
ডেটা কেবল তখনই লোড হবে যখন সেটা প্রকৃতপক্ষে প্রয়োজন হবে।@EntityGraph
অথবা JOIN FETCH
ব্যবহার করা যেতে পারে।Query Optimization হল ডেটাবেস কুয়েরি পারফরম্যান্স উন্নত করার প্রক্রিয়া। অনেক সময় কিছু কুয়েরি ডেটাবেসের উপর অতিরিক্ত লোড সৃষ্টি করে, যা অ্যাপ্লিকেশনের পারফরম্যান্স কমাতে পারে। Spring MVC এবং Hibernate/JPA তে কিছু কৌশল ব্যবহার করা যেতে পারে যাতে ডেটাবেস কুয়েরি দ্রুত এবং কার্যকরী হয়।
@Query
for Custom Queries:import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
public interface ProductRepository extends JpaRepository<Product, Long> {
@Query("SELECT p FROM Product p WHERE p.name = :name")
List<Product> findProductByName(@Param("name") String name);
}
JOIN FETCH
to Optimize Lazy Loading:@Query("SELECT u FROM User u JOIN FETCH u.orders WHERE u.id = :id")
User findUserWithOrders(@Param("id") Long id);
SELECT *
in Queries:SELECT *
এর পরিবর্তে শুধু প্রয়োজনীয় ফিল্ড নির্বাচন করুন। এটি unnecessary ডেটা রিটার্ন করার সম্ভাবনা কমায় এবং কুয়েরি পারফরম্যান্স বাড়ায়।@Cacheable
বা 2nd level cache।JOIN FETCH
, @Query
, ইনডেক্সিং এবং পেজিনেশন, ডেটাবেসের পারফরম্যান্স উন্নত করতে সাহায্য করে।এভাবে Spring MVC এবং Hibernate/JPA তে ক্যাশিং, লেজি লোডিং এবং কুয়েরি অপটিমাইজেশন ব্যবহার করে অ্যাপ্লিকেশনটির পারফরম্যান্স এবং স্কেলেবিলিটি উন্নত করা সম্ভব।